package cn.lili.modules.member.service;


import cn.lili.common.security.enums.SceneEnums;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.User;
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.vo.UserVO;
import cn.lili.modules.order.order.entity.dto.UserFlowDTO;
import cn.lili.modules.order.order.entity.vo.TeamTreeVO;
import cn.lili.modules.permission.entity.dto.UserAdminDTO;
import cn.lili.modules.system.entity.dos.UserPageDto;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.List;
import java.util.Map;

/**
 * 用户业务层
 *
 * @author Bulbasaur
 * @since 2020-02-25 14:10:16
 */
public interface UserService extends IService<User> {

    String DEFAULT_PASSWORD = new BCryptPasswordEncoder().encode(StringUtils.md5("123456"));

    /**
     * 获取当前登录的用户信息
     *
     * @return 用户信息
     */
    UserVO userInfo();

    /**
     * 通过用户名获取用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username, SceneEnums scene);

    /**
     * 用户登录
     *
     * @param userLoginDTO 用户登录查询
     * @return token
     */
    User userLoginQuery(UserLoginDTO userLoginDTO);

    /**
     * 手机号注册登录
     *
     * @param mobilePhone 手机号
     * @param scene       场景
     * @return user
     */
    User mobilePhoneLogin(String mobilePhone, SceneEnums scene);

    /**
     * 修改用户信息
     *
     * @param userEditBaseDTO 用户修改信息
     * @return 修改后的用户
     */
    User editOwn(UserEditBaseDTO userEditBaseDTO);

    /**
     * 后台-添加用户
     *
     * @param userInfoDTO 用户
     * @return 用户
     */
    User addUser(UserInfoDTO userInfoDTO);

    /**
     * 后台-修改用户
     *
     * @param userInfoDTO 后台修改用户参数
     * @return 用户
     */
    UserVO updateUser(UserInfoDTO userInfoDTO);

    /**
     * 获取用户分页
     *
     * @param userSearchParams 用户搜索VO
     * @param page             分页
     * @return 用户分页
     */
    Page<UserVO> getUserPage(UserSearchParams userSearchParams, PageVO page);

    /**
     * 获取用户列表
     *
     * @param searchParams 查询参数
     * @return 用户列表
     */
    List<User> list(UserSearchParams searchParams);


    /**
     * 修改用户状态
     * @param userStatusChangeDTO 用户状态修改DTO
     * @return 修改结果
     */
    Boolean updateUserStatus( UserStatusChangeDTO userStatusChangeDTO);

    /**
     * 根据条件查询用户总数
     *
     * @param userSearchParams 用户搜索VO
     * @return 用户总数
     */
    long getMemberNum(UserSearchParams userSearchParams);

    /**
     * 获取指定用户数据
     *
     * @param columns 指定获取的列
     * @param userIds 用户ids
     * @return 指定用户数据
     */
    List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> userIds);


    /**
     * 获取所有用户的手机号
     *
     * @return 所有用户的手机号
     */
    List<String> getMemberMobile(PageVO pageVO);

    /**
     * 更新用户登录时间为最新时间
     *
     * @param userId 用户id
     * @return 是否更新成功
     */
    Boolean updateUserLoginTime(String userId);

    /**
     * 新增用户
     *
     * @param adminUser
     */
    void saveUser(UserAdminDTO adminUser);

    /**
     * 注册用户
     *
     * @param userInfoDTO
     * @return
     */
    User registerHandler(UserInfoDTO userInfoDTO);


    /**
     * 修改场景ID
     *
     * @param userId  用户id
     * @param sceneId 场景下id
     */
    void updateSceneId(String userId, String sceneId);

    /**
     * 是否有用户引用了该部门
     *
     * @param departmentIds 部门id
     * @return 是否有用户引用了该部门
     */
    List<User> getUserByDepartmentIds(List<String> departmentIds);

    /**
     * 分销商入驻
     * @param user 用户信息
     * @return 是否成功
     */
    Boolean supplierSave(User user);

    /**
     * 根据扩展ID获取用户信息
     * @param extId 扩展ID
     * @return
     */
    User getByExtId (String extId);

    /**
     * 根据扩展ID获取用户信息
     * @param extId 扩展ID
     * @return
     */
    User getByExtId2 (String extId);


    Boolean deleteUserByExtId(String extId);

    ResultMessage<Object> getUserNotVip(UserPageDto dto);

    /**
     * 导出会员信息
     * @param userSearchParams
     * @return
     */
    List<MemberExportDTO> queryExportMember (UserSearchParams userSearchParams);

    List<User> select(String name);

    /**
     * 查询一个fy_开头的openid
     * */
    String getOpenIdByFy();

    /**
     * 根据用户id查找下级数量
     * @param userIds
     * @return
     */
    Map<String, Integer> selectUserChildCountByUserIds(List<String> userIds);

    /**
     * 根据店主用户ids查询下级id
     */
    Map<String, List<String>> selectChildUserIdsByMemberIds(List<String> userIds);

    String callGetSubordinatesAndSubSubordinates(String currentId);

    List<TeamTreeVO> teamTree(String searchName);

    /**
     * 下级列表
     */
    Page<User> getLowerUserList(UserQueryDTO dto);

    /**
     * 根据邀请人ID查询下级用户(直推用户)
     * @param parentId 邀请人ID
     * @return 直推用户集合
     * */
    List<User> getLowerByParentId(String parentId);

    /**
     * 根据邀请人ID查询下级用户(直推用户数量)
     * @param parentId 邀请人ID
     * @return 直推用户数量
     * */
    Integer getCountLowerByParentId(String parentId);

    /**
     * 根据邀请人ID查询下级用户（间推用户）
     * @param parentId 邀请人ID
     * @return 间推用户集合
     * */
    List<User> getLowerSubByParentId(String parentId);

    /**
     * 根据邀请人ID查询下级用户（间推用户数量）
     * @param parentId 邀请人ID
     * @return 间推用户集合
     * */
    Integer getCountLowerSubByParentId(String parentId);

    /**
     * 根据邀请人ID和时间查询直推用户及间推用户+用户类型+分销类型+业绩+收益
     * @param parentId 邀请人ID
     * @param flowTime 计算流水时间-年月 如：2024-01
     * @param profitSharing 结算状态
     * @return 直推用户及间推用户
     * */
    List<UserFlowDTO> getLowerAndLowerSubByParentId(String parentId, String flowTime,String profitSharing);

    /**
     * 查询团队树
     * @param parentId 邀请人ID
     * @param flowTime 计算流水时间-年月 如：2024-01
     * @param profitSharing 结算状态
     * @return 直推用户及间推用户
     * */
    List<UserFlowDTO> getLowerAndLowerSubByParentIdTree(String parentId, String flowTime,String profitSharing);

    List<User> findByIdList(List<String> chairmanIdList);

    //清除用户的工会属性
    int clearUnion(String memberId);

    /**
     * 根据id搜索满足城主的用户
     * @param dto
     * @return
     */
    List<User> selectUserForCityDistributionByAccount(UserQueryDTO dto);

    List<UnionMemberDetailDTO> countChilds(String memberId);


    /**
     * 清空上级ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean clearParent(String userId);

    Integer isAuth ();

    /**
     * 查询redis里的临时分享商品关系
     * @param redisKey
     * @return
     */
    String queryShareGoodsBindParent(String redisKey);
}